package testes;
import agenda.Contato;
import agenda.Skype;
import agenda.Usuario;
import excecoes.EmailInvalido;
import excecoes.SkypeInvalido;
import excecoes.NomeInvalido;

import org.junit.*;

public class UsuarioTest {

        private Usuario user;

        @Before
        public void criausuario() {
                user = new Usuario();
        }

        @Test
        public void testGetAndSetNome() throws NomeInvalido {

                //Inicialmente, o usuario possui um nome vazio
                Assert.assertEquals(null, user.getNome());

                //O nome � alterado e verifica-se se a altera��o foi, de fato, realizada
                user.setNome("Dugas");
                Assert.assertEquals("Dugas", user.getNome());
        }

        //Tenta alterar o nome do usuario para um nome inv�lido e verifica se a
        //exce��o lan�ada est� correta.

        @Test
        public void testNomeInvalido1() {
        	try {
        		user.setNome("abc123");
        	} catch (NomeInvalido e) {
                Assert.assertEquals("Um nome nao deve conter numeros ou caracteres especiais.", e.getMessage());
        	}
        }

        @Test
        public void testNomeInvalido2() {
        	try {
                user.setNome("\\o/");
        	} catch (NomeInvalido e) {
                Assert.assertEquals("Um nome nao deve conter numeros ou caracteres especiais.", e.getMessage());
        	}
        }

        @Test
        public void testGetAndSetEmail() throws Exception {
                Assert.assertNull(user.getEmail());
                user.setEmail("bobinho@gmail.com");
                Assert.assertEquals("bobinho@gmail.com", user.getEmail());
        }

        //um e-mail deve conter, pelo menos, um caractere '@' e um '.' para ser v�lido

        @Test
        public void testEmailInvalido1() throws Exception {
        	try {
            	user.setEmail("abc@gmail");
            } catch (EmailInvalido e) {
                    Assert.assertEquals("E-mail invalido.", e.getMessage());
            }
        }

        @Test
        public void testEmailInvalido2() throws Exception {
        	try {
                user.setEmail("abc.com.br");
        	} catch (EmailInvalido e) {
                Assert.assertEquals("E-mail invalido.", e.getMessage());
        	}
        }

        @Test
        public void testGetAndSetDescricao() {
                Assert.assertEquals(null, user.getDescricao());
                user.setDescricao("Sou um usuario feliz \\o/");
                Assert.assertEquals("Sou um usuario feliz \\o/", user.getDescricao());
        }

        @Test
        public void testAddContato() throws Exception {

        	//A agenda inicialmente nao possui contatos cadastrados
        	Assert.assertTrue(user.getAgenda().getContatos().isEmpty());

        	try {
        		Contato c1 = new Contato("Rodrigo", "endereco", "11/01", new Skype("dugas"));
        		Contato c2 = new Contato("Bobinho", "la na casa dele", "12/05", new Skype("bobs"));
        		Contato c3 = new Contato("Kelvin", "casa de Kelvin", "29/09", new Skype("ginzo"));

        	//Agora tera 1 contato: c1
        		user.addContato(c1);
        		Assert.assertTrue(user.getAgenda().getContatos().size() == 1);
        		Assert.assertEquals(0, user.getAgenda().getContatos().get(0).compareTo(c1));

        	//2 contatos, ordenados lexicograficamente pelo nome: c2, c1
        		user.addContato(c2);
        		Assert.assertTrue(user.getAgenda().getContatos().size() == 2);
        		Assert.assertEquals(0, user.getAgenda().getContatos().get(0).compareTo(c2));
        		Assert.assertEquals(0, user.getAgenda().getContatos().get(1).compareTo(c1));

        	//3 contatos: c2, c3, c1
        		user.addContato(c3);
        		Assert.assertTrue(user.getAgenda().getContatos().size() == 3);
        		Assert.assertEquals(0, user.getAgenda().getContatos().get(0).compareTo(c2));
        		Assert.assertEquals(0, user.getAgenda().getContatos().get(1).compareTo(c3));
        		Assert.assertEquals(0, user.getAgenda().getContatos().get(2).compareTo(c1));

        	} catch(SkypeInvalido s){};
        }

}